/**
 * @desc 卢恩算法来验证各种证件号码，如信用卡号，IMEI号，国家供应商标识号等。
 * @param num
 * @returns {boolean}
 */
const luHnCheck = num => {
	let arr = (num + '')
	.split('')  // 转为数组
	.reverse()  // 转置
	.map(x => parseInt(x));
	let lastDigit = arr.splice(0, 1)[0];
	// 奇数位求和。
	// 偶数位数字，先乘以2（如果乘积为两位数，则将其减去9），再求和。
	let sum = arr.reduce(
		(acc, val, i) => (i % 2 !== 0 ? acc + val : acc + ((val * 2) % 9) || 9),
		0
	);
	sum += lastDigit;
	// 将奇数位总和加上偶数位总和，结果被10整除则认为有效。
	return sum % 10 === 0;
};
// 例子
luHnCheck('4485275742308327'); // true
luHnCheck(6011329933655299); //  false
luHnCheck('123456789'); // false
